############################################################################# ############################################################################# # latexMacros.tcl (called from latex.tcl) ############################################################################# # Author: Tom Scavo ############################################################################# ############################################################################# ############################################################################# # Basic Commands ############################################################################# #-------------------------------------------------------------------------- # Goto: #-------------------------------------------------------------------------- # Switch to (but don't execute) any of the following applications. proc latex {} { global texSig texAppSig set supportedApps [array names texAppSig] foreach app $supportedApps { lappend sigs $texAppSig($app) } set longPrompt "Please locate your TeX app." if { [catch {launchBackApplSigs $sigs texSig $longPrompt} appname] } { error "bug in 'launchBackApplSigs'" set quotedSig "'[string trim $texSig {'}]'" switchTo $quotedSig proc bibtex {} { global bibtexSig bibtexAppSig set supportedApps [array names bibtexAppSig] foreach app $supportedApps { lappend sigs $bibtexAppSig($app) } set longPrompt "Please locate your BibTeX app." if { [catch {launchBackApplSigs $sigs bibtexSig $longPrompt} appname] } { error "bug in 'launchBackApplSigs'" set quotedSig "'[string trim $bibtexSig {'}]'" switchTo $quotedSig proc makeindex {} { global makeindexSig makeindexAppSig set supportedApps [array names makeindexAppSig] foreach app $supportedApps { lappend sigs $makeindexAppSig($app) } set longPrompt "Please locate your MakeIndex app." if { [catch {launchBackApplSigs $sigs makeindexSig $longPrompt} appname] } { error "bug in 'launchBackApplSigs'" set quotedSig "'[string trim $makeindexSig {'}]'" switchTo $quotedSig # Find the next or previous environment. Search forward (or backward, # depending on $forward) for either \begin or \end. If \begin is found, # search forward for corresponding \end; otherwise, search backward for # corresponding \begin. Select the found environment, or display an # error message if no environment is found. proc findEnvironment {forward} { set searchString1 {^[ \t]*\\begin\{[^\{\}]*\}|\\end\{[^\{\}]*\}[ \t]*\r?} set searchPos [getPos] if { [isSelection] } then { if { $forward } then { set searchPos [selEnd] } else { set searchPos [expr $searchPos - 1] } else { if { $forward } then { set searchPos [expr $searchPos + 1] } else { set searchPos [expr $searchPos - 1] set searchResult [search -s -f $forward -r 1 -n $searchString1 $searchPos] if {[string length $searchResult]} then { set begPos [lindex $searchResult 0] set endPos [lindex $searchResult 1] set searchText [getText $begPos $endPos] regexp {\{(.*)\}} $searchText dummy envName if {[string match {*begin*} $searchText]} { set begEnv $begPos append searchString2 {\\end\{} $envName {\}[ \t]*\r?} set searchPos $endPos set searchResult [search -s -f 1 -r 1 -n $searchString2 $searchPos] if {[string length $searchResult]} { set endPos [lindex $searchResult 1] return [list $begPos $endPos] } else { return "matching \\end not found" } else { set endEnv $endPos append searchString2 {^[ \t]*\\begin\{} $envName {\}} set searchPos $begPos set searchResult [search -s -f 0 -r 1 -n $searchString2 $searchPos] if {[string length $searchResult]} { set begPos [lindex $searchResult 0] return [list $begPos $endPos] } else { return "matching \\begin not found" } else { if { $forward } then { return "next environment not found" } else { return "previous environment not found" proc prevEnvironment {} { global searchNoisily set findResult [findEnvironment 0] if {[llength $findResult] == 2} then { goto [lindex $findResult 0] } else { if {$searchNoisily} {beep} message $findResult proc nextEnvironment {} { global searchNoisily set findResult [findEnvironment 1] if {[llength $findResult] == 2} then { goto [lindex $findResult 0] } else { if {$searchNoisily} {beep} message $findResult proc prevEnvironmentSelect {} { global searchNoisily set forward 0 set findResult [findEnvironment $forward] if {[llength $findResult] == 2} then { set endPos [lindex $findResult 1] # if { [regexp {\r} [lookAt [expr $endPos + 1]]] } then { # set endPos [expr $endPos + 1] # } select [lindex $findResult 0] $endPos } else { if { $searchNoisily } {beep} message $findResult proc nextEnvironmentSelect {} { global searchNoisily set forward 1 set findResult [findEnvironment $forward] if {[llength $findResult] == 2} then { set endPos [lindex $findResult 1] # if { [regexp {\r} [lookAt [expr $endPos + 1]]] } then { # set endPos [expr $endPos + 1] # } select [lindex $findResult 0] $endPos } else { if { $searchNoisily } {beep} message $findResult # Find a LaTeX command in either direction. It's up to the calling # procedure to pass the correct starting position of the search. proc findCommand {pos direction} { # Handle "\ " and "\[" separately: set searchString {(\\([^a-zA-Z\t\r* []|[a-zA-Z]+)\*?)|([^\\]\\\ )|([^\\]\\\[)} set searchResult [search -s -f $direction -r 1 -n $searchString $pos] if { [string length $searchResult] } { set begPos [lindex $searchResult 0] set endPos [lindex $searchResult 1] set lastChar [lookAt [expr $endPos - 1]] if {$lastChar == "\ " || $lastChar == "\["} then { return [list [expr $begPos + 1] $endPos] } else {} return $searchResult # Handles everything but "\ " and "\[": # set searchString {\\([^a-zA-Z\t\r* []|[a-zA-Z]+)\*?} # return [search -s -f $direction -r 1 -n $searchString $pos] # Find and goto the beginning of the previous LaTeX command. proc prevCommand {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findCommand [expr $pos - 1] 0] if { [string length $searchResult] } { goto [lindex $searchResult 0] return } else {} if { $searchNoisily } {beep} message "previous command not found" # Find and goto the beginning of the next LaTeX command. proc nextCommand {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { set searchResult [findCommand [expr $pos + 1] 1] if { [string length $searchResult] } { goto [lindex $searchResult 0] return } else {} if { $searchNoisily } {beep} message "next command not found" # Select the previous LaTeX command, but do not attempt to select # any associated argument. proc prevCommandSelect {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findCommand [expr $pos - 1] 0] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message "previous command not found" # Select the next LaTeX command, but do not attempt to select # any associated argument. proc nextCommandSelect {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findCommand $pos 1] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message "next command not found" # Find a LaTeX command with arguments in either direction. It's up # to the calling procedure to pass the starting position of the search. # (Handles everything but "\ " and commands whose arguments contain # embedded braces.) proc findCommandWithArgs {pos direction} { set searchString {\\([^a-zA-Z\t\r]|[a-zA-Z]+\*?)(\[.*\])*({[^{}]*})*} return [search -s -f $direction -r 1 -n $searchString $pos] # Select the previous LaTeX command and any associated arguments. proc prevCommandSelectWithArgs {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findCommandWithArgs [expr $pos - 1] 0] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message "previous command not found" # Select the next LaTeX command and any associated arguments. proc nextCommandSelectWithArgs {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findCommandWithArgs $pos 1] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message "next command not found" # Find a LaTeX sectioning command in either direction. It's up to # the calling procedure to pass the starting position of the search. proc findSection {pos direction} { global funcExprAlt return [search -s -f $direction -r 1 -n $funcExprAlt $pos] # Select the previous LaTeX sectioning command. proc prevSection {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findSection [expr $pos - 1] 0] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message {previous section not found} # Select the next LaTeX sectioning command. proc nextSection {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findSection $pos 1] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message {next section not found} proc prevSectionSelect {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findSection [expr $pos - 1] 0] if { [string length $searchResult] } { set begPos [lindex $searchResult 0] set searchPos [expr [lindex $searchResult 1] + 1] set searchResult [findSection $searchPos 1] if { [string length $searchResult] } { set endPos [lindex $searchResult 0] } else { set searchResult [search -s -f 1 -r 0 -n "\\end{document}" $searchPos] set endPos [lindex $searchResult 0] select $begPos $endPos return } else {} if { $searchNoisily } {beep} message {previous section not found} # Select the next LaTeX sectioning command. proc nextSectionSelect {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findSection $pos 1] if { [string length $searchResult] } { set begPos [lindex $searchResult 0] set searchPos [expr [lindex $searchResult 1] + 1] set searchResult [findSection $searchPos 1] if { [string length $searchResult] } { set endPos [lindex $searchResult 0] } else { set searchResult [search -s -f 1 -r 0 -n "\\end{document}" $searchPos] set endPos [lindex $searchResult 0] select $begPos $endPos return } else {} if { $searchNoisily } {beep} message {next section not found} # Find a LaTeX subsectioning command in either direction. It's up to # the calling procedure to pass the starting position of the search. proc findSubsection {pos direction} { global funcExpr return [search -s -f $direction -r 1 -n $funcExpr $pos] proc prevSubsection {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findSubsection [expr $pos - 1] 0] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message {previous (sub)*section not found} # Select the next LaTeX sectioning command. proc nextSubsection {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findSubsection $pos 1] if { [string length $searchResult] } { eval select $searchResult return } else {} if { $searchNoisily } {beep} message {next (sub)*section not found} proc prevSubsectionSelect {} { global searchNoisily set pos [getPos] if {$pos > 0} then { set searchResult [findSubsection [expr $pos - 1] 0] if { [string length $searchResult] } { set begPos [lindex $searchResult 0] set endPos [lindex $searchResult 1] set searchPos [expr $endPos + 1] set commandName [extractCommandName [getText $begPos $endPos]] if {[string match {section*} $commandName]} then { set searchResult [findSection $searchPos 1] } else { set searchResult [findSubsection $searchPos 1] if { [string length $searchResult] } { set endPos [lindex $searchResult 0] } else { set searchResult [search -s -f 1 -r 0 -n "\\end{document}" $searchPos] set endPos [lindex $searchResult 0] select $begPos $endPos return } else {} if { $searchNoisily } {beep} message {previous (sub)*section not found} # Select the next LaTeX sectioning command. proc nextSubsectionSelect {} { global searchNoisily set pos [getPos] if {$pos < [maxPos]} then { if { [isSelection] } then { set pos [expr $pos + 1] set searchResult [findSubsection $pos 1] if { [string length $searchResult] } { set begPos [lindex $searchResult 0] set endPos [lindex $searchResult 1] set searchPos [expr $endPos + 1] set commandName [extractCommandName [getText $begPos $endPos]] if {[string match {section*} $commandName]} then { set searchResult [findSection $searchPos 1] } else { set searchResult [findSubsection $searchPos 1] if { [string length $searchResult] } { set endPos [lindex $searchResult 0] } else { set searchResult [search -s -f 1 -r 0 -n "\\end{document}" $searchPos] set endPos [lindex $searchResult 0] select $begPos $endPos return } else {} if { $searchNoisily } {beep} message {next (sub)*section not found} proc gotoTabStop {dirIndicator} { set pos [getPos] if {$dirIndicator} then { if {$pos == [maxPos]} { return 0 } } else { if {$pos == 0} { return 0 } # Fixes a bug in 'search': set pos [expr $pos - 1] set searchResult [search -s -n -f $dirIndicator -m 0 -i 1 -r 0 { } $pos] if {[string length $searchResult]} then { goto [lindex $searchResult 0] return 1 } else { return 0 proc nextTabStop {} { global searchNoisily set forward 1 if { [gotoTabStop $forward] } then { deleteChar } else { if { $searchNoisily } {beep} message "tab stop not found" proc prevTabStop {} { global searchNoisily set forward 0 if { [gotoTabStop $forward] } then { deleteChar } else { if { $searchNoisily } {beep} message "tab stop not found" # Goto the nth tab stop. A nonzero argument is non-interactive # (for use in Tcl procs) and not validated. proc nthTabStop {{numTabStops 0}} { global searchNoisily promptNoisily useStatusBar if { $numTabStops == 0 } then { if { $promptNoisily && $useStatusBar } { beep } catch {sPrompt "How many tab stops?" "3"} numTabStops if { $numTabStops == "cancel" || $numTabStops == 0 } then { return } elseif { ![isInteger $numTabStops] } then { beep message "invalid input: integer required" return set currentPos [getPos] if { $numTabStops > 0 } { set forward 1 } { set forward 0 } set maxits [expr abs($numTabStops)] if { ![gotoTabStop $forward] } then { if { $searchNoisily } {beep} message "tab stop not found" goto $currentPos return for { set i 1 } { $i < $maxits } { incr i } { if { $forward } { forwardChar } { backwardChar } if { ![gotoTabStop $forward] } then { if { $searchNoisily } { beep } message "tab stop not found" goto $currentPos return deleteChar #-------------------------------------------------------------------------- # Utilities: #-------------------------------------------------------------------------- # A keyboard-bound method of accessing menu commands. Takes a list of # menu items (i.e., the tail of a 'menu' command), the menu name (the # argument of the '-n' switch) , and the name of a menu filter (the # argument of the '-p' switch) as input, and displays these items in a # list box. If the chosen item is a menu command (as opposed to a # submenu), it is passed to the menu filter; otherwise, 'chooseCommand' # recursively calls itself until a menu command is chosen or the cancel # button is pressed. proc chooseCommand {menuItems {menuName ""} {menuFilterProc ""} {level 1}} { watchCursor if { $menuItems == "" } { return } # Preprocess the list of menu items: foreach item $menuItems { regsub -all {[= 0 } { lappend top "[lindex $item [incr ind]]:" } elseif { ![string match "(*" $item] } { lappend top $item # Present the menu items to the user: set res [listpick -p "Choose menu command (level $level):" $top] # Either execute a command or recurse on a submenu: if { [lsearch $menOut $res] >= 0 } { # Execute the command via the menu filter, if necessary: if { $menuFilterProc == "" } { $res } else { $menuFilterProc $menuName $res } else { set res [string trimright $res {:}] foreach item $menOut { if { [lsearch $item $res] >= 0 } { set menuItems [lindex $item end] # Determine the name of this submenu: if { [set ind [lsearch $item {-n}]] >= 0 } { set menuName [lindex $item [incr ind]] } else { set menuName "" } # Determine the name of the menu filter for this submenu: if { [set ind [lsearch $item {-p}]] >= 0 } { set menuFilterProc [lindex $item [incr ind]] } else { set menuFilterProc "" } return [chooseCommand $menuItems $menuName $menuFilterProc [incr level]] proc insertLiteralTab {} { if {[isSelection]} then { deleteSelection insertText "\t" proc insertTabStop {} { if {[isSelection]} then { deleteSelection insertText " # Removes all tab stops from the current selection (if there is one) # or the current document, maintaining the cursor position in the # latter case. proc deleteTabStops {} { global searchNoisily watchCursor set subs1 0; set subs2 0; set subs3 0 set pos [getPos] if {[set start $pos] == [set end [selEnd]]} { set messageString "document" set start 0 set end [maxPos] set text1 [getText $start $pos] set subs1 [regsub -all { } $text1 {} text1] set text2 [getText $pos $end] set subs2 [regsub -all { } $text2 {} text2] append text $text1 $text2 } else { set messageString "selection" set text [getText $start $end] set subs3 [regsub -all { } $text {} text] if {$subs1 || $subs2 || $subs3} then { replaceText $start $end $text if {$messageString == "document"} then { goto [expr $pos - $subs1] } else { set end [getPos] select $start $end set subs [expr $subs1 + $subs2 + $subs3] message "$subs tab stops removed from $messageString" } else { if {$searchNoisily} {beep} message "no tab stops found in $messageString" # Delete all unnecessary comments from the current document: proc deleteComments {} { switch [askyesno "Warning! This operation can not be undone. \ Continue anyway?"] { "yes" {} "no" { return } replaceString {} eval select [search -f 1 -r 1 -i 1 -m 0 -- {^[ \t]*%.*\r} 0] replaceAll replaceString {} eval select [search -f 1 -r 1 -i 1 -m 0 -- {[ \t]+%.*} 0] replaceAll replaceString {\1%} eval select [search -f 1 -r 1 -i 1 -m 0 -- {([^\\](\\\\)*)%.*} 0] replaceAll # Converts all straight quotes to their TeX equivalents. proc convertQuotes {} { global searchNoisily message "working watchCursor set messageString "selection" if {[set start [getPos]] == [set end [selEnd]]} { set messageString "document" set start 0 set end [maxPos] set text [getText $start $end] # Convert all left double quotes: set convert1 [regsub -all "\(\^\|\[\ \r\t\(\[\{\]\)\"" $text {\1``} text] # Convert all right double quotes: set convert2 [regsub -all "\(\[\^\\\\\]\)\"" $text {\1''} text] # Convert all left single quotes: set convert3 [regsub -all "\(\^\|\[\ \r\t\(\[\{\]\)\'" $text {\1`} text] if {$convert1 || $convert2 || $convert3} then { replaceText $start $end $text message "all quotes in $messageString converted" } else { if {$searchNoisily} {beep} message "no quotes found in $messageString" # Returns true if the argument contains non-literal double dollar # signs, and false otherwise. proc containsDoubleDollarSigns {text} { return [regexp {(^|[^\\])\$\$} $text] # Converts all $$...$$ pairs to \[...\] and returns the number of such # pairs converted. If the dollar signs are unbalanced, does nothing # and returns -1. proc convertDoubleDollarSigns {} { watchCursor set messageString "selection" if {[set start [getPos]] == [set end [selEnd]]} { set messageString "document" set start 0 set end [maxPos] set text [getText $start $end] set subs [regsub -all {(^|[^\\])\$\$([^$]*)\$\$} $text {\1\\[\2\\]} text] if {[containsDoubleDollarSigns $text]} then {return -1} if {$subs} then { replaceText $start $end $text return [expr $subs] # Returns true if the argument contains a non-literal dollar sign, # and false otherwise. proc containsSingleDollarSign {text} { return [regexp {(^|[^\\])\$} $text] # Converts all $...$ pairs to \(...\), maintains the cursor position, # and returns the number of such pairs converted. If the dollar signs # are unbalanced, does nothing and returns -1. proc convertSingleDollarSigns {} { watchCursor set subs1 0; set subs2 0; set subs3 0 set pos [getPos]; set pos2 $pos if {[set start $pos] == [set end [selEnd]]} { set isSelection 0 set start 0 set end [maxPos] set text1 [getText $start $pos] set subs1 [regsub -all {(^|[^\\])\$([^$]*)\$} $text1 {\1\\(\2\\)} text1] # Is there a dollar sign left over? If so, search backward for this # dollar sign and prepare to do a substitution on the text to the right # of this dollar sign. if {[containsSingleDollarSign $text1]} then { set searchString {[^\\]\$} set searchResult [search -s -n -f 0 -m 0 -i 1 -r 1 $searchString [expr $pos-1]] set pos2 [lindex $searchResult 0] set text1 [string range $text1 0 [expr $pos2 + (2 * $subs1)]] set pos [expr $pos + 2] set text2 [getText $pos2 $end] set subs2 [regsub -all {(^|[^\\])\$([^$]*)\$} $text2 {\1\\(\2\\)} text2] # Is there a dollar sign left over? If so, it's unbalanced. if {[containsSingleDollarSign $text2]} then {return -1} append text $text1 $text2 } else { set isSelection 1 set text [getText $start $end] set subs3 [regsub -all {(^|[^\\])\$([^$]*)\$} $text {\1\\(\2\\)} text] # Is there a dollar sign left over? If so, it's unbalanced. if {[containsSingleDollarSign $text]} then {return -1} if {$subs1 || $subs2 || $subs3} then { replaceText $start $end $text # If there is a selection, just put it back. Otherwise, adjust the # cursor position based on the number of substitutions. if {$isSelection} then { set end [getPos] select $start $end } else { goto [expr $pos + (2 * $subs1)] return [expr $subs1 + $subs2 + $subs3] proc convertDollarSigns {} { global searchNoisily if {[isSelection]} then { set messageString "selection" } else { set messageString "document" set subs2 [convertDoubleDollarSigns] if {$subs2 == -1} then { beep alertnote "unmatched double dollar signs in $messageString" } else { set subs1 [convertSingleDollarSigns] if {$subs1 == -1} then { beep alertnote "unmatched single dollar sign in $messageString" } elseif {$subs1 == 0 && $subs2 == 0} then { if {$searchNoisily} {beep} message "no dollar signs found in $messageString" } else { message "$subs1 pairs of \$ \$ and $subs2 pairs of \$\$ \$\$ removed from $messageString" ############################################################################# # Paragraph Mode Macros ############################################################################# #-------------------------------------------------------------------------- # Documents: #-------------------------------------------------------------------------- proc newLaTeXDocument {} { catch {prompt "Choose a documentclass:" "article" "" "article" \ "report" "book" "letter" "slides"} documentType if {$documentType != "cancel"} then { new newMode TeX if { [catch {${documentType}Documentclass}] } then { wrapDocument "$documentType" while { [options] } {} nextTabStop message "enter option (or leave blank)" proc letterDocumentclass {} { set preamble "\r\\address\{%\r" append preamble " \\\\ % insert your name here\r" append preamble " \\\\ % insert your address here\r" append preamble " \\\\ % insert more address here\r" append preamble " % insert city-state-zip here\r" append preamble "\}\r\r" append preamble "\\date\{ \} % optional\r" append preamble "\\signature\{ \}\r\r" set body "\r\\begin\{letter\}\{%\r" append body " \\\\ % insert addressee's name here\r" append body " \\\\ % insert addressee's address here\r" append body " \\\\ % insert more address here\r" append body " % insert addressee's city-state-zip here\r" append body "\}\r\r" append body "\\opening\{Dear ,\}\r\r" if {[isEmptyFile]} then { append body "% BODY OF LETTER\r" append body " \r\r" } else { if {[isDocumentSelected]} then { set text [getSelect] # deleteText 0 [maxPos] append body "$text\r" } else { alertnote "nonempty file: delete text or \'Select All\'\ from the Edit menu" return append body "\\closing\{Sincerely,\}\r\r" append body "\\encl\{ \}\r" append body "\\cc\{ \}\r\r" append body "\\end\{letter\}\r\r" insertDocument "letter" $preamble $body nextTabStop message "enter option (or leave blank)" proc articleDocumentclass {} { if { [wrapDocument "article"] } { nextTabStop message "enter option (or leave blank)" proc reportDocumentclass {} { if { [wrapDocument "report"] } { nextTabStop message "enter option (or leave blank)" proc bookDocumentclass {} { if { [wrapDocument "book"] } { nextTabStop message "enter option (or leave blank)" proc slidesDocumentclass {} { if { [wrapDocument "slides"] } { nextTabStop message "enter option (or leave blank)" proc otherDocumentclass {} { catch {prompt "What documentclass?" "article"} documentType if {$documentType != "cancel"} then { if { [wrapDocument "$documentType"] } { nextTabStop message "enter option (or leave blank)" # If an option is inserted, return true; otherwise, return false. proc options {} { set option [getOption] if {$option != ""} then { insertOption $option return 1 return 0 proc getOption {} { catch {prompt "Choose an option:" "11pt" "" "10pt" "11pt" "12pt" "(-" \ "letterpaper" "legalpaper" "executivepaper" "a4paper" "a5paper" \ "b5paper" "(-" "landscape" "(-" "final" "draft" "(-" \ "oneside" "twoside" "(-" "openright" "openany" "(-" \ "onecolumn" "twocolumn" "(-" "notitlepage" "titlepage" \ "openbib" "(-" "leqno" "(-" "fleqn"} optionName if {$optionName != "cancel"} then { return $optionName } else { return "" proc insertOption {option} { global TeXmodeVars set searchString {\\documentclass} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] == 0} then { if { $TeXmodeVars(searchNoisily) } {beep} message "can\'t find \\documentclass" } else { set nextCharPos [lindex $searchResult 1] goto $nextCharPos set nextChar [lookAt $nextCharPos] if {$nextChar == "\["} then { forwardChar insertText $option if {[lookAt [getPos]] != "\]"} then { insertText "," } elseif {$nextChar == "\{"} then { insertText "\[$option\]" } else { alertnote "unrecognizable \\documentclass statement" proc insertPackage {package} { global TeXmodeVars # Check to see if $package is already loaded: if { $package != "" } then { # append searchString {\\usepackage\{.*} $package {.*\}} append searchString {^[^%]*\\usepackage\{.*} $package {.*\}} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] != 0} then { if { $TeXmodeVars(searchNoisily) } {beep} message "$package package already loaded" return # Newlines are allowed in the arguments of \documentclass: set searchString {\\documentclass(\[[^][]*\])?{[^{}]*}} # Search for \documentclass command: set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] == 0} then { if { $TeXmodeVars(searchNoisily) } {beep} message "can't find \\documentclass" } else { pushMark goto [lindex $searchResult 1] set txt "\r\\usepackage\{$package\}" insertText $txt backwardChar message "Press to return to previous position" proc filecontents {} { global searchNoisily set searchString {\\documentclass} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] == 0} then { if {$searchNoisily} {beep} message "can\'t find \\documentclass" return } else { set prompt "File to be included:" if {[catch {getfile $prompt} path]} then { return } else { replaceText 0 0 [buildFilecontents $path] goto 0 message "file included" proc filecontentsAll {} { global searchNoisily watchCursor message "locating all input files set currentWin [lindex [winNames -f] 0] # Is the current window part of TeX fileset? set fset [isWindowInFileset $currentWin "tex"] if { $fset == "" } { set searchString {\\documentclass} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] == 0} then { if {$searchNoisily} {beep} message "can\'t find \\documentclass" return } else { set text [getText 0 [maxPos]] } else { # Will not handle a base file that is open and dirty: set text [buildFilecontents [texFilesetBaseName $fset]] set currentDir [file dirname $currentWin] set newText [texResolveAll $text $currentDir] if { [string length $text] == [string length $newText] } then { beep message "no files to include" } else { replaceText 0 [maxPos] $newText goto 0 message "all files included" # Takes a LaTeX document string and a path as input, and returns # a modified document string with all filecontents environments # prepended. proc texResolveAll {latexDoc currentDir} { global TeXmodeVars set pairs [list \ {{\\documentclass} {.cls}} {{\\LoadClass} {.cls}} \ {{\\include} {.tex}} \ {{\\usepackage} {.sty}} {{\\RequirePackage} {.sty}} \ {{\\input} {}} \ {{\\bibliography} {.bib}} {{\\bibliographystyle} {.bst}} \ ] foreach macro $TeXmodeVars(boxMacroNames) { regsub {\*} $macro {\\*} macro lappend pairs [list \\\\$macro {}] foreach pair $pairs { set cmd [car $pair] set ext [cadr $pair] set searchString $cmd append searchString {(\[[^][]*\])?{([^{}]*)}} set searchText $latexDoc while { [regexp -indices $searchString $searchText mtch dummy theArgs] } { set begPos [lindex $theArgs 0] set endPos [lindex $theArgs 1] set args [string range $searchText $begPos $endPos] foreach arg [split $args ,] { if { $cmd == {\\input} && ![string length [file extension $arg]] } { set ext {.tex} } set files [glob -nocomplain $currentDir:$arg*] set filename "$currentDir:$arg$ext" if { [lsearch -exact $files $filename] > -1 } { set tempDoc $latexDoc set latexDoc [buildFilecontents $filename] append latexDoc $tempDoc } set searchText [string range $searchText [expr $endPos + 2] end] return $latexDoc # Takes a filename as input and returns a filecontents environment # based on the contents of that file. If a second argument is given, # use that as the argument of the filecontents environment instead # of the original filename. proc buildFilecontents {filename {newFilename {}}} { set text [readFile $filename] # Fix end-of-line characters: regsub -all "\xa" $text "\xd" text set envName "filecontents" if { $newFilename == {} } { set envArg "{[file tail $filename]}" } else { set envArg "{$newFilename}" return [buildEnvironment $envName $envArg "$text\r" "\r\r"] #-------------------------------------------------------------------------- # Page Layout: #-------------------------------------------------------------------------- proc maketitle {} { global searchNoisily set searchString {\\document(class|style)(\[.*\])?\{.*\}} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString 0] if {[llength $searchResult] == 0} then { if {$searchNoisily} {beep} message "can\'t find \\documentclass or \\documentstyle" } else { set searchPos [lindex $searchResult 1] set searchString {\\begin\{document\}} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 $searchString $searchPos] if {[llength $searchResult] == 0} then { if {$searchNoisily} {beep} message "can\'t find \\begin\{document\}" } else { goto [lindex $searchResult 1] set currentPos [getPos] set txt "\r\r% Definition of title page:" append txt "\r\\title\{" append txt "\r\t \r\}" append txt "\r\\author\{" append txt "\r\t \t% insert author(s) here" append txt "\r\}" append txt "\r\\date\{ \}\t% optional" append txt "\r\r\\maketitle" insertText $txt goto $currentPos nextTabStop message "insert title" proc abstract {} { doWrapEnvironment "abstract" } proc titlepage {} { doWrapEnvironment "titlepage" } proc getPagestyle {} { catch {prompt "Choose a pagestyle:" "plain" "" "plain" "empty" \ "headings" "myheadings"} pagestyleName if {$pagestyleName != "cancel"} then { return $pagestyleName } else { return "" proc pagestyle {} { set pagestyleName [getPagestyle] if {$pagestyleName != ""} then { openingCarriageReturn insertObject "\\pagestyle\{$pagestyleName\}" closingCarriageReturn proc thispagestyle {} { set pagestyleName [getPagestyle] if {$pagestyleName != ""} then { openingCarriageReturn insertObject "\\thispagestyle\{$pagestyleName\}" closingCarriageReturn proc getPagenumberingStyle {} { catch {prompt "Choose a pagenumbering style:" "arabic" "" "arabic" \ "roman" "Roman" "alph" "Alph"} pagenumberingStyle if {$pagenumberingStyle != "cancel"} then { return $pagenumberingStyle } else { return "" proc pagenumbering {} { set pagenumberingStyle [getPagenumberingStyle] if {$pagenumberingStyle != ""} then { openingCarriageReturn insertObject "\\pagenumbering\{$pagenumberingStyle\}" closingCarriageReturn proc twocolumn {} { openingCarriageReturn insertObject "\\twocolumn" closingCarriageReturn proc onecolumn {} { openingCarriageReturn insertObject "\\onecolumn" closingCarriageReturn #-------------------------------------------------------------------------- # Sectioning: #-------------------------------------------------------------------------- proc part {} { if {[wrapObject "\\part{" "} "]} then { message "don't forget the label" } else { message "type the part name and don't forget the label" proc chapter {} { if {[wrapObject "\\chapter{" "} "]} then { message "don't forget the label" } else { message "type the chapter name and don't forget the label" proc section {} { if {[wrapObject "\\section{" "} "]} then { message "don't forget the label" } else { message "type the section name and don't forget the label" proc subsection {} { if {[wrapObject "\\subsection{" "} "]} then { message "don't forget the label" } else { message "type the subsection name and don't forget the label" proc subsubsection {} { if {[wrapObject "\\subsubsection{" "} "]} then { message "don't forget the label" } else { message "type the subsubsection name and don't forget the label" proc paragraph {} { if {[wrapObject "\\paragraph{" "} "]} then { message "don't forget the label" } else { message "type the paragraph name and don't forget the label" proc subparagraph {} { if {[wrapObject "\\subparagraph{" "} "]} then { message "don't forget the label" } else { message "type the subparagraph name and don't forget the label" proc appendix {} {insertObject "\\appendix"} #-------------------------------------------------------------------------- # Text Style: #-------------------------------------------------------------------------- proc emph {} { if {[wrapObject "\\emph{" "} "]} then { message "selected text has been emphasized" } else { message "enter text to be emphasized" proc textup {} { if {[wrapObject "\\textup{" "} "]} then { message "selected text has upright shape" } else { message "enter text to have upright shape" proc textit {} { if {[wrapObject "\\textit{" "} "]} then { message "selected text has italic shape" } else { message "enter text to have italic shape" proc textsl {} { if {[wrapObject "\\textsl{" "} "]} then { message "selected text has slanted shape" } else { message "enter text to have slanted shape" proc textsc {} { if {[wrapObject "\\textsc{" "} "]} then { message "selected text has small caps shape" } else { message "enter text to have small caps shape" proc textmd {} { if {[wrapObject "\\textmd{" "} "]} then { message "selected text has been set in medium series" } else { message "enter text to be set in medium series" proc textbf {} { if {[wrapObject "\\textbf{" "} "]} then { message "selected text has been set in bold series" } else { message "enter text to be set in bold series" proc textrm {} { if {[wrapObject "\\textrm{" "} "]} then { message "selected text has been set with roman family" } else { message "enter text to be set using roman family" proc textsf {} { if {[wrapObject "\\textsf{" "} "]} then { message "selected text has been set with sans serif family" } else { message "enter text to be set using sans serif family" proc texttt {} { if {[wrapObject "\\texttt{" "} "]} then { message "selected text has been set with typewriter family" } else { message "enter text to be set using typewriter family" proc textnormal {} { if {[wrapObject "\\textnormal{" "} "]} then { message "selected text has been set with normal style" } else { message "enter text to be set using normal style" proc em {} { if {[wrapObject "{\\em " "} "]} then { message "emphasized text set" } else { message "enter text to be emphasized" proc upshape {} { if {[wrapObject "{\\upshape " "} "]} then { message "text set in upright shape" } else { message "enter text to be set in upright shape" proc itshape {} { if {[wrapObject "{\\itshape " "} "]} then { message "text set in italics shape" } else { message "enter text to be set in italics shape" proc slshape {} { if {[wrapObject "{\\slshape " "} "]} then { message "text set in slanted shape" } else { message "enter text to be set in slanted shape" proc scshape {} { if {[wrapObject "{\\scshape " "} "]} then { message "text set in small caps shape" } else { message "enter text to be set in small caps shape" proc mdseries {} { if {[wrapObject "{\\mdseries " "} "]} then { message "text set in medium series" } else { message "enter text to be set in medium series" proc bfseries {} { if {[wrapObject "{\\bfseries " "} "]} then { message "text set in bold series" } else { message "enter text to be set in bold series" proc rmfamily {} { if {[wrapObject "{\\rmfamily " "} "]} then { message "text set in roman family" } else { message "enter text to be set in roman family" proc sffamily {} { if {[wrapObject "{\\sffamily " "} "]} then { message "text set in sans serif family" } else { message "enter text to be set in sans serif family" proc ttfamily {} { if {[wrapObject "{\\ttfamily " "} "]} then { message "text set in typewriter family" } else { message "enter text to be set in typewriter family" proc normalfont {} { if {[wrapObject "{\\normalfont " "} "]} then { message "text set in normal style" } else { message "enter text to be set in normal style" #-------------------------------------------------------------------------- # Text Size: #-------------------------------------------------------------------------- proc tiny {} { if {[wrapObject "{\\tiny " "} "]} then { message "tiny text set" } else { message "enter tiny text" proc scriptsize {} { if {[wrapObject "{\\scriptsize " "} "]} then { message "scriptsize text set" } else { message "enter scriptsize text" proc footnotesize {} { if {[wrapObject "{\\footnotesize " "} "]} then { message "footnotesize text set" } else { message "enter footnotesize text" proc small {} { if {[wrapObject "{\\small " "} "]} then { message "small text set" } else { message "enter small text" proc normalsize {} { if {[wrapObject "{\\normalsize " "} "]} then { message "normalsize text set" } else { message "enter normalsize text" proc large {} { if {[wrapObject "{\\large " "} "]} then { message "large text set" } else { message "enter large text" proc Large {} { if {[wrapObject "{\\Large " "} "]} then { message "Large text set" } else { message "enter Large text" proc LARGE {} { if {[wrapObject "{\\LARGE " "} "]} then { message "LARGE text set" } else { message "enter LARGE text" proc huge {} { if {[wrapObject "{\\huge " "} "]} then { message "huge text set" } else { message "enter huge text" proc Huge {} { if {[wrapObject "{\\Huge " "} "]} then { message "Huge text set" } else { message "enter Huge text" #-------------------------------------------------------------------------- # International: #-------------------------------------------------------------------------- proc { } {} { if {[wrapObject "\\`{" "} "]} then { message "accent set" } else { message "enter single character" proc { } {} { if {[wrapObject "\\'{" "} "]} then { message "accent set" } else { message "enter single character" proc { } {} { if {[wrapObject "\\^{" "} "]} then { message "accent set" } else { message "enter single character" proc { } {} { if {[wrapObject "\\\"{" "} "]} then { message "accent set" } else { message "enter single character" proc { } {} { if {[wrapObject "\\~{" "} "]} then { message "accent set" } else { message "enter single character" proc { } {} {insertObject "\\c\{c\}"} proc { } {} {insertObject "\\c\{C\}"} proc { } {} {insertObject "\\oe"} proc { } {} {insertObject "\\OE"} proc { } {} {insertObject "\\ae"} proc { } {} {insertObject "\\AE"} proc { } {} {insertObject "\\aa"} proc { } {} {insertObject "\\AA"} proc { } {} {insertObject "\\o"} proc { } {} {insertObject "\\O"} proc { } {} {insertObject "\\ss"} proc { } {} {insertObject "?`"} proc { } {} {insertObject "!`"} #-------------------------------------------------------------------------- # Environments: #-------------------------------------------------------------------------- proc enumerate {} { global promptNoisily useStatusBar set envName "enumerate" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many items?" 3} numberItems if {$numberItems == "cancel"} then { return } elseif {![isPositiveInteger $numberItems]} then { beep message "invalid input: unsigned, postive integer required" return if {$numberItems} then { set body "\t\\item for {set i 1} {$i < $numberItems} {incr i} { append body "\r\r\t\\item append body "\r" } else { set body "\t if {[insertEnvironment $envName "" $body]} then { nextTabStop message "type first item" proc itemize {} { global promptNoisily useStatusBar set envName "itemize" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many items?" 3} numberItems if {$numberItems == "cancel"} then { return } elseif {![isPositiveInteger $numberItems]} then { beep message "invalid input: unsigned, postive integer required" return if {$numberItems} then { set body "\t\\item for {set i 1} {$i < $numberItems} {incr i} { append body "\r\r\t\\item append body "\r" } else { set body "\t if {[insertEnvironment $envName "" $body]} then { nextTabStop message "type first item" proc description {} { global promptNoisily useStatusBar set envName "description" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many items?" 3} numberItems if {$numberItems == "cancel"} then { return } elseif {![isPositiveInteger $numberItems]} then { beep message "invalid input: unsigned, postive integer required" return if {$numberItems} then { set body "\t\\item\[ for {set i 1} {$i < $numberItems} {incr i} { append body "\r\r\t\\item\[ append body "\r" } else { set body "\t if {[insertEnvironment $envName "" $body]} then { nextTabStop message "type first item label" proc thebibliography {} { global promptNoisily useStatusBar set envName "thebibliography" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many items?" 3} numberItems if {$numberItems == "cancel"} then { return } elseif {![isPositiveInteger $numberItems]} then { beep message "invalid input: unsigned, postive integer required" return set arg "{9}" if {$numberItems} then { if {$numberItems > 9} then {set arg "{99}"} set body "\t\\bibitem{ for {set i 1} {$i < $numberItems} {incr i} { append body "\r\r\t\\bibitem{ append body "\r" } else { set body "\t if {[insertEnvironment $envName $arg $body]} then { set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 {(9)+} [getPos]] eval select $searchResult message "Change the length of the key field?" proc slide {} { doWrapEnvironment "slide" } proc overlay {} { doWrapEnvironment "overlay" } proc note {} { doWrapEnvironment "note" } # proc figure {} { # global TeXmodeVars # set envName "figure" # set envArg "tbp" # set arg "\[$envArg\]" # set theIndentation [getIndentation [getPos]] # append arg "\r$theIndentation\t\\centering" # set body "" # if { $TeXmodeVars(useBoxMacro) } then { # set defaultMacro [car $TeXmodeVars(boxMacroNames)] # if { $defaultMacro == "" } { # append body "\t # } else { # set restOfMacros [cdr $TeXmodeVars(boxMacroNames)] # if { ![llength $restOfMacros] } { # append body "\t\\$defaultMacro{ # } else { # set cmd [list prompt "Choose a boxMacro:"] # lappend cmd $defaultMacro "" # foreach boxMacroName $TeXmodeVars(boxMacroNames) { # lappend cmd $boxMacroName # } # catch $cmd macro # if {$macro != "cancel"} then { # append body "\t\\$macro{ # } else { # message "operation canceled" # return # } # } # } # append body "\t\\caption{ # append body "\t\\label{ # if { $TeXmodeVars(useBoxMacro) } then { # if {![insertEnvironment $envName $arg $body]} then {return} # } else { # wrapEnvironment $envName $arg $body # set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 "$envArg" [getPos]] # eval select $searchResult # message "Modify this argument? (t=top; b=bottom; p=page; h=here; !=try harder)" proc figure {} { global TeXmodeVars set envName "figure" set envArg "tbp" set arg "\[$envArg\]" set theIndentation [getIndentation [getPos]] append arg "\r$theIndentation\t\\centering" set body "" set macro [car $TeXmodeVars(boxMacroNames)] if { $macro != "" } { set restOfMacros [cdr $TeXmodeVars(boxMacroNames)] if { ![llength $restOfMacros] } { append body "\t\\$macro{ } else { set cmd [list prompt "Choose a box macro:"] lappend cmd $macro "" foreach boxMacroName $TeXmodeVars(boxMacroNames) { lappend cmd $boxMacroName catch $cmd macro if {$macro == "cancel"} then { message "operation canceled" return } elseif {$macro == ""} then { # do nothing } else { append body "\t\\$macro{ append body "\t\\caption{ append body "\t\\label{ if { $macro == "" } then { wrapEnvironment $envName $arg $body } else { if {![insertEnvironment $envName $arg $body]} then {return} set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 "$envArg" [getPos]] eval select $searchResult message "Modify this argument? (t=top; b=bottom; p=page; h=here; !=try harder)" proc table {} { set envName "table" set envArg "tbp" set arg "\[$envArg\]" set theIndentation [getIndentation [getPos]] append arg "\r$theIndentation\t\\centering" # The following statement puts the caption at the top: append arg "\r$theIndentation\t\\caption{ # The following statement puts the caption at the bottom: # set body "\t\\caption{ append body "\t\\label{ wrapEnvironment $envName $arg $body set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 "$envArg" [getPos]] eval select $searchResult message "Modify this argument? (t=top; b=bottom; p=page; h=here; !=try harder)" proc buildRow {jmax} { set txt " for {set j 1} {$j < $jmax} {incr j} { append txt " & return $txt proc tabular {} { global promptNoisily useStatusBar set envName "tabular" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many rows?" 3} numberRows if {$numberRows == "cancel"} then { return } elseif {![isPositiveInteger $numberRows]} then { beep message "invalid input: unsigned, postive integer required" return if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many columns?" 3} numberCols if {$numberCols == "cancel"} then { return } elseif {![isPositiveInteger $numberCols]} then { beep message "invalid input: unsigned, postive integer required" return set arg "{|" for {set j 1} {$j <= $numberCols} {incr j} { append arg "c|" append arg "}" set body "\t\\hline\r" for {set i 1} {$i <= $numberRows} {incr i} { append body "\t[buildRow $numberCols]" append body " \\\\\r\t\\hline\r" if {[insertEnvironment $envName $arg $body]} then { set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 {(c|\|)+} [getPos]] select [lindex $searchResult 0] [lindex $searchResult 1] message "Modify this argument?" proc verbatim {} { doWrapEnvironment "verbatim" } proc quote {} { doWrapEnvironment "quote" } proc quotation {} { doWrapEnvironment "quotation" } proc verse {} { doWrapEnvironment "verse" } proc flushleft {} { doWrapEnvironment "flushleft" } proc center {} { doWrapEnvironment "center" } proc flushright {} { doWrapEnvironment "flushright" } proc general {} { catch {prompt "What environment?" ""} environmentName if {$environmentName != "cancel"} { doWrapEnvironment "$environmentName" #-------------------------------------------------------------------------- # Boxes: #-------------------------------------------------------------------------- proc mbox {} { if {[wrapObject "\\mbox{" "} "]} then { message "mbox set" } else { message "enter text" proc makebox {} { if {[wrapObject "\\makebox\[ \]{" "} "]} then { message "makebox set; enter the width and position" } else { message "enter the width and position of the makebox, then the text" proc fbox {} { if {[wrapObject "\\fbox{" "} "]} then { message "fbox set" } else { message "enter text" proc framebox {} { if {[wrapObject "\\framebox\[ \]{" "} "]} then { message "framebox set; enter the width and position" } else { message "enter the width and position of the framebox, then the text" proc newsavebox {} { if {[wrapObject "\\newsavebox{" "} "]} then { message "newsavebox defined" } else { message "enter the command name of the sbox or savebox" proc sbox {} { if {[wrapObject "\\sbox{ }{" "} "]} then { message "sbox set; enter the command name" } else { message "enter the command name of the sbox, then the text" proc savebox {} { if {[wrapObject "\\savebox{ \]{" "} "]} then { message "savebox set; enter the command name" } else { message "enter the command name of the savebox" proc usebox {} { if {[wrapObject "\\usebox{" "} "]} then { message "usebox declared" } else { message "enter the command name of the sbox or savebox" proc raisebox {} { if {[wrapObject "\\raisebox{ \]{" "} "]} then { message "raisebox set; enter the displacement" } else { message "enter the displacement of the raisebox" proc parbox {} { if {[wrapObject "\\parbox\[ \}{" "} "]} then { message "parbox set; enter the position and width" } else { message "enter the position \[b|c|t\] and width of the parbox, then the text" proc minipage {} { set arg "\[ wrapEnvironment "minipage" $arg "" nextTabStop message "enter the position \[b|c|t\] of the minipage, then the width" proc rule {} { insertObject "\\rule\[ nthTabStop -4 message "enter the displacement of the rule, then width and height" #-------------------------------------------------------------------------- # Misc: #-------------------------------------------------------------------------- proc verb {} { if {[wrapObject "\\verb|" "| "]} then { message "verbatim text set" } else { message "enter verbatim text" proc footnote {} { if {[wrapObject "\\footnote{" "} "]} then { message "footnote set" } else { message "enter footnote" proc marginalNote {} { if {[wrapObject "\\marginpar{" "} "]} then { message "marginal note set" } else { message "enter marginal note" proc label {} { if {[wrapObject "\\label{" "} "]} then { message "label defined" } else { message "enter label" proc ref {} { TeXRefCompletion "ref" proc pageref {} { TeXRefCompletion "pageref" proc cite {} { if {[wrapObject "\\cite{" "} "]} then { message "citation made" } else { message "enter citation key" proc nocite {} { if {[wrapObject "\\nocite{" "} "]} then { message "citation added to the list" } else { message "enter citation key" # Insert an \item or a \bibitem, depending on the context. proc insertItem {} { set command [eval getText [searchEnvironment]] set environment [extractCommandArg $command] switch $environment { "itemize" { set text "\\item "enumerate" { set text "\\item "description" { set text "\\item\[ "thebibliography" { set text "\\bibitem{ default { beep message "insertItem: cursor in $environment environment" return set pos [getPos] # Indentation should mirror that of an existing \item # (if it exists) insertText [openingCarriageReturn]$text goto $pos nextTabStop proc quotes {} { if {[wrapObject "`" "' "]} then { message "text quoted" } else { message "enter text" proc dblQuotes {} { if {[wrapObject "``" "'' "]} then { message "text double quoted" } else { message "enter text" proc ldots {} {insertObject "\\ldots"} proc {en-dash} {} {insertObject "--"} proc {em-dash} {} {insertObject "---"} proc texLogo {} {insertObject "\\TeX"} proc latexLogo {} {insertObject "\\LaTeX"} proc latex2eLogo {} {insertObject "\\LaTeXe"} proc today {} {insertObject "\\today"} proc dag {} {insertObject "\\dag"} proc ddag {} {insertObject "\\ddag"} proc sectionMark {} {insertObject "\\S"} proc paragraphMark {} {insertObject "\\P"} proc copyright {} {insertObject "\\copyright"} proc pounds {} {insertObject "\\pounds"} ############################################################################# # Math Mode Macros ############################################################################# #-------------------------------------------------------------------------- # Math Modes: #-------------------------------------------------------------------------- proc texMath {} { checkMathMode "texMath" 0 if {[wrapObject "$" "$ "]} then { message "formula set" } else { message "enter formula" proc texDisplaymath {} { checkMathMode "texDisplaymath" 0 if {[wrapObject "$$" "$$ "]} then { message "displayed formula set" } else { message "enter displayed formula" proc latexMath {} { checkMathMode "latexMath" 0 if {[wrapObject "\\( " " \\) "]} then { message "formula set" } else { message "enter formula" proc latexDisplaymath {} { checkMathMode "latexDisplaymath" 0 if {[wrapObject "\\\[ " " \\\] "]} then { message "displayed formula set" } else { message "enter displayed formula" #-------------------------------------------------------------------------- # Math Style: #-------------------------------------------------------------------------- proc mathit {} { checkMathMode "mathit" 1 if {[wrapObject "\\mathit{" "} "]} then { message "selected text is math italic" } else { message "enter text to be math italic" proc mathrm {} { checkMathMode "mathrm" 1 if {[wrapObject "\\mathrm{" "} "]} then { message "selected text is math roman" } else { message "enter text to be math roman" proc mathbf {} { checkMathMode "mathbf" 1 if {[wrapObject "\\mathbf{" "} "]} then { message "selected text is math bold" } else { message "enter text to be math bold" proc mathsf {} { checkMathMode "mathsf" 1 if {[wrapObject "\\mathsf{" "} "]} then { message "selected text is math sans serif" } else { message "enter text to be math sans serif" proc mathtt {} { checkMathMode "mathtt" 1 if {[wrapObject "\\mathtt{" "} "]} then { message "selected text is math typewriter" } else { message "enter text to be math typewriter" proc mathcal {} { checkMathMode "mathcal" 1 # Allow upper-case arguments only: if {[isSelection] && ![isUppercase]} then { alertnote "argument to \\mathcal must be uppercase" return if {[wrapObject "\\mathcal{" "} "]} then { message "selected text is calligraphic" } else { message "enter text to be calligraphic (UPPERCASE letters only)" proc displaystyle {} { checkMathMode "displaystyle" 1 if {[wrapObject "{\\displaystyle " "} "]} then { message "displaystyle set" } else { message "enter displaystyle text" proc textstyle {} { checkMathMode "textstyle" 1 if {[wrapObject "{\\textstyle " "} "]} then { message "textstyle set" } else { message "enter textstyle text" proc scriptstyle {} { checkMathMode "scriptstyle" 1 if {[wrapObject "{\\scriptstyle " "} "]} then { message "scriptstyle set" } else { message "enter scriptstyle text" proc scriptscriptstyle {} { checkMathMode "scriptscriptstyle" 1 if {[wrapObject "{\\scriptscriptstyle " "} "]} then { message "scriptscriptstyle set" } else { message "enter scriptscriptstyle text" #-------------------------------------------------------------------------- # Math Environments: #-------------------------------------------------------------------------- proc math {} { checkMathMode "math" 0; doWrapEnvironment "math" } proc displaymath {} { checkMathMode "displaymath" 0 global TeXmodeVars if { $TeXmodeVars(useBrackets) } { doWrapStructure {\[} {} {\]} } else { doWrapEnvironment "displaymath" proc equation {} { checkMathMode "equation" 0 set envName "equation" set body "\t\\label{ if {[wrapEnvironment $envName "" $body]} then { set msgText "equation wrapped" } else { set msgText "enter equation" nextTabStop message $msgText proc eqnarrayStar {} { global promptNoisily useStatusBar checkMathMode "eqnarrayStar" 0 set envName "eqnarray*" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many rows?" 3} numberRows if {$numberRows == "cancel"} then { return } elseif {![isPositiveInteger $numberRows]} then { beep message "invalid input: unsigned, postive integer required" return set row "\t[buildRow 3]" for {set i 1} {$i < $numberRows} {incr i} { append body $row append body " \\\\\r" append body $row append body "\r" if {[insertEnvironment $envName "" $body]} then { nextTabStop message "type first item" proc eqnarray {} { global promptNoisily useStatusBar checkMathMode "eqnarray" 0 set envName "eqnarray" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many rows?" 3} numberRows if {$numberRows == "cancel"} then { return } elseif {![isPositiveInteger $numberRows]} then { beep message "invalid input: unsigned, postive integer required" return set row "\t[buildRow 3]\r\t\\label{ for {set i 1} {$i < $numberRows} {incr i} { append body $row append body " \\\\\r" append body $row append body "\r" if {[insertEnvironment $envName "" $body]} then { nextTabStop message "type first item" proc myArray {} { global promptNoisily useStatusBar checkMathMode "myArray" 1 set envName "array" if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many rows?" 3} numberRows if {$numberRows == "cancel"} then { return } elseif {![isPositiveInteger $numberRows]} then { beep message "invalid input: unsigned, postive integer required" return if {$promptNoisily && $useStatusBar} {beep} catch {sPrompt "$envName: how many columns?" 3} numberCols if {$numberCols == "cancel"} then { return } elseif {![isPositiveInteger $numberCols]} then { beep message "invalid input: unsigned, postive integer required" return set arg "{" for {set j 1} {$j <= $numberCols} {incr j} { append arg "c" append arg "}" set row "\t[buildRow $numberCols]" for {set i 1} {$i < $numberRows} {incr i} { append body $row append body " \\\\\r" append body $row append body "\r" if {[insertEnvironment $envName $arg $body]} then { set searchResult [search -s -n -f 1 -m 0 -i 1 -r 1 {c+} [getPos]] select [lindex $searchResult 0] [lindex $searchResult 1] message "Modify this argument?" #-------------------------------------------------------------------------- # Formulas: #-------------------------------------------------------------------------- proc subscript {} { checkMathMode "subscript" 1 if {[wrapObject "_{" "} "]} then { message "subscript set" } else { message "enter subscript" proc superscript {} { checkMathMode "superscript" 1 if {[wrapObject "^{" "} "]} then { message "superscript set" } else { message "enter superscript" proc fraction {} { checkMathMode "fraction" 1 set currentPos [getPos] if {[isSelection]} then { set selection [getSelect] set args [split $selection /] set len [llength $args] deleteText $currentPos [selEnd] if {$len == 1} then { insertObject "\\frac{$selection}{ goto $currentPos nextTabStop message "enter denominator" } else { set firstArg [lindex $args 0] set restArgs [lrange $args 1 [expr $len-1]] insertObject "\\frac{$firstArg}{[join $restArgs /]}" if {$len > 2} {message "beware of multiple /"} } else { insertObject "\\frac{ goto $currentPos nextTabStop message "enter numerator" proc squareRoot {} { checkMathMode "squareRoot" 1 if {[wrapObject "\\sqrt{" "} "]} then { message "square root set" } else { message "enter formula" proc nthRoot {} { checkMathMode "nthRoot" 1 if {[wrapObject "\\sqrt\[ \]{" "} "]} then { message "enter root" } else { message "enter root, then formula" proc oneParameter {} { checkMathMode "oneParameter" 1 if {[wrapObject "\\ {" "} "]} then { message "enter command name" } else { message "enter command name, press , enter argument" proc twoParameters {} { checkMathMode "twoParameters" 1 if {[wrapObject "\\ {" "}{ "]} then { message "enter command name" } else { message "enter command name, press , enter argument, etc." #-------------------------------------------------------------------------- # Greek: #-------------------------------------------------------------------------- proc alpha {} {checkMathMode "alpha" 1; insertObject "\\alpha"} proc beta {} {checkMathMode "beta" 1; insertObject "\\beta"} proc gamma {} {checkMathMode "gamma" 1; insertObject "\\gamma"} proc delta {} {checkMathMode "delta" 1; insertObject "\\delta"} proc epsilon {} {checkMathMode "epsilon" 1; insertObject "\\epsilon"} proc zeta {} {checkMathMode "zeta" 1; insertObject "\\zeta"} proc eta {} {checkMathMode "eta" 1; insertObject "\\eta"} proc theta {} {checkMathMode "theta" 1; insertObject "\\theta"} proc iota {} {checkMathMode "iota" 1; insertObject "\\iota"} proc kappa {} {checkMathMode "kappa" 1; insertObject "\\kappa"} proc lambda {} {checkMathMode "lambda" 1; insertObject "\\lambda"} proc mu {} {checkMathMode "mu" 1; insertObject "\\mu"} proc nu {} {checkMathMode "nu" 1; insertObject "\\nu"} proc xi {} {checkMathMode "xi" 1; insertObject "\\xi"} proc omicron {} {checkMathMode "omicron" 1; insertObject "o"} proc pi {} {checkMathMode "pi" 1; insertObject "\\pi"} proc rho {} {checkMathMode "rho" 1; insertObject "\\rho"} proc sigma {} {checkMathMode "sigma" 1; insertObject "\\sigma"} proc tau {} {checkMathMode "tau" 1; insertObject "\\tau"} proc upsilon {} {checkMathMode "upsilon" 1; insertObject "\\upsilon"} proc phi {} {checkMathMode "phi" 1; insertObject "\\phi"} proc chi {} {checkMathMode "chi" 1; insertObject "\\chi"} proc psi {} {checkMathMode "psi" 1; insertObject "\\psi"} proc omega {} {checkMathMode "omega" 1; insertObject "\\omega"} proc Gamma {} {checkMathMode "Gamma" 1; insertObject "\\Gamma"} proc Delta {} {checkMathMode "Delta" 1; insertObject "\\Delta"} proc Theta {} {checkMathMode "Theta" 1; insertObject "\\Theta"} proc Lambda {} {checkMathMode "Lambda" 1; insertObject "\\Lambda"} proc Xi {} {checkMathMode "Xi" 1; insertObject "\\Xi"} proc Pi {} {checkMathMode "Pi" 1; insertObject "\\Pi"} proc Sigma {} {checkMathMode "Sigma" 1; insertObject "\\Sigma"} proc Upsilon {} {checkMathMode "Upsilon" 1; insertObject "\\Upsilon"} proc Phi {} {checkMathMode "Phi" 1; insertObject "\\Phi"} proc Psi {} {checkMathMode "Psi" 1; insertObject "\\Psi"} proc Omega {} {checkMathMode "Omega" 1; insertObject "\\Omega"} proc varepsilon {} {checkMathMode "varepsilon" 1; insertObject "\\varepsilon"} proc vartheta {} {checkMathMode "vartheta" 1; insertObject "\\vartheta"} proc varpi {} {checkMathMode "varpi" 1; insertObject "\\varpi"} proc varrho {} {checkMathMode "varrho" 1; insertObject "\\varrho"} proc varsigma {} {checkMathMode "varsigma" 1; insertObject "\\varsigma"} proc varphi {} {checkMathMode "varphi" 1; insertObject "\\varphi"} #-------------------------------------------------------------------------- # Binary Ops: #-------------------------------------------------------------------------- proc pm {} {checkMathMode "pm" 1; insertObject "\\pm"} proc mp {} {checkMathMode "mp" 1; insertObject "\\mp"} proc times {} {checkMathMode "times" 1; insertObject "\\times"} proc div {} {checkMathMode "div" 1; insertObject "\\div"} proc ast {} {checkMathMode "ast" 1; insertObject "\\ast"} proc star {} {checkMathMode "star" 1; insertObject "\\star"} proc circ {} {checkMathMode "circ" 1; insertObject "\\circ"} proc bullet {} {checkMathMode "bullet" 1; insertObject "\\bullet"} proc cdot {} {checkMathMode "cdot" 1; insertObject "\\cdot"} proc cap {} {checkMathMode "cap" 1; insertObject "\\cap"} proc cup {} {checkMathMode "cup" 1; insertObject "\\cup"} proc uplus {} {checkMathMode "uplus" 1; insertObject "\\uplus"} proc sqcap {} {checkMathMode "sqcap" 1; insertObject "\\sqcap"} proc sqcup {} {checkMathMode "sqcup" 1; insertObject "\\sqcup"} proc vee {} {checkMathMode "vee" 1; insertObject "\\vee"} proc wedge {} {checkMathMode "wedge" 1; insertObject "\\wedge"} proc setminus {} {checkMathMode "setminus" 1; insertObject "\\setminus"} proc wr {} {checkMathMode "wr" 1; insertObject "\\wr"} proc diamond {} {checkMathMode "diamond" 1; insertObject "\\diamond"} proc bigtriangleup {} { checkMathMode "bigtriangleup" 1; insertObject "\\bigtriangleup" proc bigtriangledown {} { checkMathMode "bigtriangledown" 1; insertObject "\\bigtriangledown" proc triangleleft {} { checkMathMode "triangleleft" 1; insertObject "\\triangleleft" proc triangleright {} { checkMathMode "triangleright" 1; insertObject "\\triangleright" proc lhd {} { if {[isSymbolPackageLoaded]} then { checkMathMode "lhd" 1; insertObject "\\lhd" proc rhd {} { if {[isSymbolPackageLoaded]} then { checkMathMode "rhd" 1; insertObject "\\rhd" proc unlhd {} { if {[isSymbolPackageLoaded]} then { checkMathMode "unlhd" 1; insertObject "\\unlhd" proc unrhd {} { if {[isSymbolPackageLoaded]} then { checkMathMode "unrhd" 1; insertObject "\\unrhd" proc oplus {} {checkMathMode "oplus" 1; insertObject "\\oplus"} proc ominus {} {checkMathMode "ominus" 1; insertObject "\\ominus"} proc otimes {} {checkMathMode "otimes" 1; insertObject "\\otimes"} proc oslash {} {checkMathMode "oslash" 1; insertObject "\\oslash"} proc odot {} {checkMathMode "odot" 1; insertObject "\\odot"} proc bigcirc {} {checkMathMode "bigcirc" 1; insertObject "\\bigcirc"} proc dagger {} {checkMathMode "dagger" 1; insertObject "\\dagger"} proc ddagger {} {checkMathMode "ddagger" 1; insertObject "\\ddagger"} proc amalg {} {checkMathMode "amalg" 1; insertObject "\\amalg"} #-------------------------------------------------------------------------- # Relations: #-------------------------------------------------------------------------- proc leq {} {checkMathMode "leq" 1; insertObject "\\leq"} proc prec {} {checkMathMode "prec" 1; insertObject "\\prec"} proc preceq {} {checkMathMode "preceq" 1; insertObject "\\preceq"} proc myLl {} {checkMathMode "myLl" 1; insertObject "\\ll"} proc subset {} {checkMathMode "subset" 1; insertObject "\\subset"} proc subseteq {} {checkMathMode "subseteq" 1; insertObject "\\subseteq"} proc sqsubset {} { if {[isSymbolPackageLoaded]} then { checkMathMode "sqsubset" 1; insertObject "\\sqsubset" proc sqsubseteq {} {checkMathMode "sqsubseteq" 1; insertObject "\\sqsubseteq"} proc in {} {checkMathMode "in" 1; insertObject "\\in"} proc vdash {} {checkMathMode "vdash" 1; insertObject "\\vdash"} proc geq {} {checkMathMode "geq" 1; insertObject "\\geq"} proc succ {} {checkMathMode "succ" 1; insertObject "\\succ"} proc succeq {} {checkMathMode "succeq" 1; insertObject "\\succeq"} proc gg {} {checkMathMode "gg" 1; insertObject "\\gg"} proc supset {} {checkMathMode "supset" 1; insertObject "\\supset"} proc supseteq {} {checkMathMode "supseteq" 1; insertObject "\\supseteq"} proc sqsupset {} { if {[isSymbolPackageLoaded]} then { checkMathMode "sqsupset" 1; insertObject "\\sqsupset" proc sqsupseteq {} {checkMathMode "sqsupseteq" 1; insertObject "\\sqsupseteq"} proc ni {} {checkMathMode "ni" 1; insertObject "\\ni"} proc dashv {} {checkMathMode "dashv" 1; insertObject "\\dashv"} proc equiv {} {checkMathMode "equiv" 1; insertObject "\\equiv"} proc sim {} {checkMathMode "sim" 1; insertObject "\\sim"} proc simeq {} {checkMathMode "simeq" 1; insertObject "\\simeq"} proc asymp {} {checkMathMode "asymp" 1; insertObject "\\asymp"} proc approx {} {checkMathMode "approx" 1; insertObject "\\approx"} proc cong {} {checkMathMode "cong" 1; insertObject "\\cong"} proc neq {} {checkMathMode "neq" 1; insertObject "\\neq"} proc doteq {} {checkMathMode "doteq" 1; insertObject "\\doteq"} proc propto {} {checkMathMode "propto" 1; insertObject "\\propto"} proc models {} {checkMathMode "models" 1; insertObject "\\models"} proc perp {} {checkMathMode "perp" 1; insertObject "\\perp"} proc mid {} {checkMathMode "mid" 1; insertObject "\\mid"} proc parallel {} {checkMathMode "parallel" 1; insertObject "\\parallel"} proc bowtie {} {checkMathMode "bowtie" 1; insertObject "\\bowtie"} proc myJoin {} { if {[isSymbolPackageLoaded]} then { checkMathMode "myJoin" 1; insertObject "\\join" proc smile {} {checkMathMode "smile" 1; insertObject "\\smile"} proc frown {} {checkMathMode "frown" 1; insertObject "\\frown"} #-------------------------------------------------------------------------- # Arrows: #-------------------------------------------------------------------------- proc leftarrow {} {checkMathMode "leftarrow" 1; insertObject "\\leftarrow"} proc Leftarrow {} {checkMathMode "Leftarrow" 1; insertObject "\\Leftarrow"} proc rightarrow {} {checkMathMode "rightarrow" 1; insertObject "\\rightarrow"} proc Rightarrow {} {checkMathMode "Rightarrow" 1; insertObject "\\Rightarrow"} proc leftrightarrow {} { checkMathMode "leftrightarrow" 1; insertObject "\\leftrightarrow" proc Leftrightarrow {} { checkMathMode "Leftrightarrow" 1; insertObject "\\Leftrightarrow" proc mapsto {} {checkMathMode "mapsto" 1; insertObject "\\mapsto"} proc hookleftarrow {} { checkMathMode "hookleftarrow" 1; insertObject "\\hookleftarrow" proc leftharpoonup {} { checkMathMode "leftharpoonup" 1; insertObject "\\leftharpoonup" proc leftharpoondown {} { checkMathMode "leftharpoondown" 1; insertObject "\\leftharpoondown" proc rightleftharpoons {} { checkMathMode "rightleftharpoons" 1; insertObject "\\rightleftharpoons" proc longleftarrow {} { checkMathMode "longleftarrow" 1; insertObject "\\longleftarrow" proc Longleftarrow {} { checkMathMode "Longleftarrow" 1; insertObject "\\Longleftarrow" proc longrightarrow {} { checkMathMode "longrightarrow" 1; insertObject "\\longrightarrow" proc Longrightarrow {} { checkMathMode "Longrightarrow" 1; insertObject "\\Longrightarrow" proc longleftrightarrow {} { checkMathMode "longleftrightarrow" 1; insertObject "\\longleftrightarrow" proc Longleftrightarrow {} { checkMathMode "Longleftrightarrow" 1; insertObject "\\Longleftrightarrow" proc longmapsto {} {checkMathMode "longmapsto" 1; insertObject "\\longmapsto"} proc hookrightarrow {} { checkMathMode "hookrightarrow" 1; insertObject "\\hookrightarrow" proc rightharpoonup {} { checkMathMode "rightharpoonup" 1; insertObject "\\rightharpoonup" proc rightharpoondown {} { checkMathMode "rightharpoondown" 1; insertObject "\\rightharpoondown" proc leadsto {} { if {[isSymbolPackageLoaded]} then { checkMathMode "leadsto" 1; insertObject "\\leadsto" proc uparrow {} {checkMathMode "uparrow" 1; insertObject "\\uparrow"} proc Uparrow {} {checkMathMode "Uparrow" 1; insertObject "\\Uparrow"} proc downarrow {} {checkMathMode "downarrow" 1; insertObject "\\downarrow"} proc Downarrow {} {checkMathMode "Downarrow" 1; insertObject "\\Downarrow"} proc updownarrow {} {checkMathMode "updownarrow" 1; insertObject "\\updownarrow"} proc Updownarrow {} {checkMathMode "Updownarrow" 1; insertObject "\\Updownarrow"} proc nearrow {} {checkMathMode "nearrow" 1; insertObject "\\nearrow"} proc searrow {} {checkMathMode "searrow" 1; insertObject "\\searrow"} proc swarrow {} {checkMathMode "swarrow" 1; insertObject "\\swarrow"} proc nwarrow {} {checkMathMode "nwarrow" 1; insertObject "\\nwarrow"} #-------------------------------------------------------------------------- # Dots: #-------------------------------------------------------------------------- proc cdots {} {checkMathMode "cdots" 1; insertObject "\\cdots"} proc vdots {} {checkMathMode "vdots" 1; insertObject "\\vdots"} proc ddots {} {checkMathMode "ddots" 1; insertObject "\\ddots"} #-------------------------------------------------------------------------- # Symbols: #-------------------------------------------------------------------------- proc aleph {} {checkMathMode "aleph" 1; insertObject "\\aleph"} proc hbar {} {checkMathMode "hbar" 1; insertObject "\\hbar"} proc imath {} {checkMathMode "imath" 1; insertObject "\\imath"} proc jmath {} {checkMathMode "jmath" 1; insertObject "\\jmath"} proc ell {} {checkMathMode "ell" 1; insertObject "\\ell"} proc wp {} {checkMathMode "wp" 1; insertObject "\\wp"} proc Re {} {checkMathMode "Re" 1; insertObject "\\Re"} proc Im {} {checkMathMode "Im" 1; insertObject "\\Im"} proc mho {} { if {[isSymbolPackageLoaded]} then { checkMathMode "mho" 1; insertObject "\\mho" proc prime {} {checkMathMode "prime" 1; insertObject "\\prime"} proc emptyset {} {checkMathMode "emptyset" 1; insertObject "\\emptyset"} proc nabla {} {checkMathMode "nabla" 1; insertObject "\\nabla"} proc surd {} {checkMathMode "surd" 1; insertObject "\\surd"} proc top {} {checkMathMode "top" 1; insertObject "\\top"} proc bot {} {checkMathMode "bot" 1; insertObject "\\bot"} # proc | {} {checkMathMode "|" 1; insertObject "\\|"} proc angle {} {checkMathMode "angle" 1; insertObject "\\angle"} proc forall {} {checkMathMode "forall" 1; insertObject "\\forall"} proc exists {} {checkMathMode "exists" 1; insertObject "\\exists"} proc neg {} {checkMathMode "neg" 1; insertObject "\\neg"} proc flat {} {checkMathMode "flat" 1; insertObject "\\flat"} proc natural {} {checkMathMode "natural" 1; insertObject "\\natural"} proc sharp {} {checkMathMode "sharp" 1; insertObject "\\sharp"} proc backslash {} {checkMathMode "backslash" 1; insertObject "\\backslash"} proc partial {} {checkMathMode "partial" 1; insertObject "\\partial"} proc infty {} {checkMathMode "infty" 1; insertObject "\\infty"} proc Box {} { if {[isSymbolPackageLoaded]} then { checkMathMode "Box" 1; insertObject "\\Box" proc Diamond {} { if {[isSymbolPackageLoaded]} then { checkMathMode "Diamond" 1; insertObject "\\Diamond" proc triangle {} {checkMathMode "triangle" 1; insertObject "\\triangle"} proc clubsuit {} {checkMathMode "clubsuit" 1; insertObject "\\clubsuit"} proc diamondsuit {} {checkMathMode "diamondsuit" 1; insertObject "\\diamondsuit"} proc heartsuit {} {checkMathMode "heartsuit" 1; insertObject "\\heartsuit"} proc spadesuit {} {checkMathMode "spadesuit" 1; insertObject "\\spadesuit"} #-------------------------------------------------------------------------- # Functions: #-------------------------------------------------------------------------- proc arccos {} {checkMathMode "arccos" 1; insertObject "\\arccos"} proc arcsin {} {checkMathMode "arcsin" 1; insertObject "\\arcsin"} proc arctan {} {checkMathMode "arctan" 1; insertObject "\\arctan"} proc arg {} {checkMathMode "arg" 1; insertObject "\\arg"} proc cos {} {checkMathMode "cos" 1; insertObject "\\cos"} proc cosh {} {checkMathMode "cosh" 1; insertObject "\\cosh"} proc cot {} {checkMathMode "cot" 1; insertObject "\\cot"} proc coth {} {checkMathMode "coth" 1; insertObject "\\coth"} proc csc {} {checkMathMode "csc" 1; insertObject "\\csc"} proc deg {} {checkMathMode "deg" 1; insertObject "\\deg"} proc det {} {checkMathMode "det" 1; insertObject "\\det"} proc dim {} {checkMathMode "dim" 1; insertObject "\\dim"} proc exp {} {checkMathMode "exp" 1; insertObject "\\exp"} proc gcd {} {checkMathMode "gcd" 1; insertObject "\\gcd"} proc hom {} {checkMathMode "hom" 1; insertObject "\\hom"} # proc inf {} {checkMathMode "inf" 1; insertObject "\\inf"} proc inf {} { checkMathMode "inf" 1 if {[wrapObject "\\inf_{" "} "]} then { message "limit set" } else { message "enter limit" proc ker {} {checkMathMode "ker" 1; insertObject "\\ker"} proc lg {} {checkMathMode "lg" 1; insertObject "\\lg"} # proc lim {} {checkMathMode "lim" 1; insertObject "\\lim"} proc lim {} { checkMathMode "lim" 1 if {[wrapObject "\\lim_{" "} "]} then { message "limit set" } else { message "enter limit" # proc liminf {} {checkMathMode "liminf" 1; insertObject "\\liminf"} proc liminf {} { checkMathMode "liminf" 1 if {[wrapObject "\\liminf_{" "} "]} then { message "limit set" } else { message "enter limit" # proc limsup {} {checkMathMode "limsup" 1; insertObject "\\limsup"} proc limsup {} { checkMathMode "limsup" 1 if {[wrapObject "\\limsup_{" "} "]} then { message "limit set" } else { message "enter limit" proc ln {} {checkMathMode "ln" 1; insertObject "\\ln"} proc log {} {checkMathMode "log" 1; insertObject "\\log"} # proc max {} {checkMathMode "max" 1; insertObject "\\max"} proc max {} { checkMathMode "max" 1 if {[wrapObject "\\max_{" "} "]} then { message "limit set" } else { message "enter limit" # proc min {} {checkMathMode "min" 1; insertObject "\\min"} proc min {} { checkMathMode "min" 1 if {[wrapObject "\\min_{" "} "]} then { message "limit set" } else { message "enter limit" proc Pr {} {checkMathMode "Pr" 1; insertObject "\\Pr"} proc sec {} {checkMathMode "sec" 1; insertObject "\\sec"} proc sin {} {checkMathMode "sin" 1; insertObject "\\sin"} proc sinh {} {checkMathMode "sinh" 1; insertObject "\\sinh"} # proc sup {} {checkMathMode "sup" 1; insertObject "\\sup"} proc sup {} { checkMathMode "sup" 1 if {[wrapObject "\\sup_{" "} "]} then { message "limit set" } else { message "enter limit" proc tan {} {checkMathMode "tan" 1; insertObject "\\tan"} proc tanh {} {checkMathMode "tanh" 1; insertObject "\\tanh"} proc bmod {} {checkMathMode "bmod" 1; insertObject "\\bmod"} proc pmod {} { checkMathMode "pmod" 1 if {[wrapObject "\\pmod{" "} "]} then { message "parenthesized mod set" } else { message "enter formula" #-------------------------------------------------------------------------- # Large Ops: #-------------------------------------------------------------------------- proc insertLargeOp {commandName} { checkMathMode "$commandName" 1 set currentPos [getPos] insertObject "\\$commandName\_{ goto $currentPos nextTabStop proc sum {} {insertLargeOp "sum"} proc prod {} {insertLargeOp "prod"} proc coprod {} {insertLargeOp "coprod"} proc int {} {insertLargeOp "int"} proc oint {} {insertLargeOp "oint"} proc bigcap {} {insertLargeOp "bigcap"} proc bigcup {} {insertLargeOp "bigcup"} proc bigsqcup {} {insertLargeOp "bigsqcup"} proc bigvee {} {insertLargeOp "bigvee"} proc bigwedge {} {insertLargeOp "bigwedge"} proc bigodot {} {insertLargeOp "bigodot"} proc bigotimes {} {insertLargeOp "bigotimes"} proc bigoplus {} {insertLargeOp "bigoplus"} proc biguplus {} {insertLargeOp "biguplus"} #-------------------------------------------------------------------------- # Delimiters: #-------------------------------------------------------------------------- proc delimitObject {leftDelim rightDelim} { if {[wrapObject $leftDelim $rightDelim]} then { message "formula delimited" } else { message "enter formula" proc parentheses {} { checkMathMode "parentheses" 1; delimitObject "(" ") proc brackets {} { checkMathMode "brackets" 1; delimitObject "\[" "\] proc braces {} { checkMathMode "braces" 1; delimitObject "\\\{" "\\\} proc absoluteValue {} { checkMathMode "absoluteValue" 1; delimitObject "|" "| proc getDelims {} { catch {prompt "Choose delimiters:" "parentheses" "" "parentheses" \ "brackets" "braces" "angle brackets" "vertical bars" \ "double bars" "ceiling" "floor"} delimType if {$delimType != "cancel"} then { switch $delimType { "parentheses" { set leftDelim "(" set rightDelim ")" "brackets" { set leftDelim "\[" set rightDelim "\]" "braces" { set leftDelim "\\\{" set rightDelim "\\\}" "vertical bars" { set leftDelim "|" set rightDelim "|" "double bars" { set leftDelim "\\|" set rightDelim "\\|" "angle brackets" { set leftDelim "\\langle" set rightDelim "\\rangle" "ceiling" { set leftDelim "\\lceil" set rightDelim "\\rceil" "floor" { set leftDelim "\\lfloor" set rightDelim "\\rfloor" default { alertnote "\"$delimType\" not recognized" return "" return [list $leftDelim $rightDelim] } else {return ""} proc otherDelims {} { checkMathMode "otherDelims" 1 set delims [getDelims] if {$delims != ""} then { set leftDelim [lindex $delims 0] set rightDelim [lindex $delims 1] delimitObject "$leftDelim" "$rightDelim proc {half-openInterval} {} { checkMathMode "half-openInterval" 1; delimitObject "(" "\] proc {half-closedInterval} {} { checkMathMode "half-closedInterval" 1; delimitObject "\[" ") proc insertBigDelims {leftDelim rightDelim isMultiline} { checkMathMode "insertBigDelims" 1 if {$isMultiline} then { doWrapStructure $leftDelim "" $rightDelim } else { if { [wrapObject $leftDelim $rightDelim] } then { message "formula delimited" } else { message "enter formula" proc bigParens {} { checkMathMode "bigParens" 1; insertBigDelims "\\left(" "\\right) proc multiBigParens {} { checkMathMode "multiBigParens" 1; insertBigDelims "\\left(" "\\right) proc bigBrackets {} { checkMathMode "bigBrackets" 1; insertBigDelims "\\left\[" "\\right\] proc multiBigBrackets {} { checkMathMode "multiBigBrackets" 1; insertBigDelims "\\left\[" "\\right\] proc bigBraces {} { checkMathMode "bigBraces" 1; insertBigDelims "\\left\\\{" "\\right\\\} proc multiBigBraces {} { checkMathMode "multiBigBraces" 1; insertBigDelims "\\left\\\{" "\\right\\\} proc bigAbsValue {} { checkMathMode "bigAbsValue" 1; insertBigDelims "\\left|" "\\right| proc multiBigAbsValue {} { checkMathMode "multiBigAbsValue" 1; insertBigDelims "\\left|" "\\right| proc doOtherBigDelims {name isMultiline} { checkMathMode $name 1 set delims [getDelims] if {$delims != ""} then { append leftDelim "\\left" [lindex $delims 0] append rightDelim "\\right" [lindex $delims 1] insertBigDelims "$leftDelim" "$rightDelim " $isMultiline proc otherBigDelims {} { doOtherBigDelims "otherBigDelims" 0 proc otherMultiBigDelims {} { doOtherBigDelims "otherMultiBigDelims" 1 proc bigLeftBrace {} { checkMathMode "bigLeftBrace" 1 insertBigDelims "\\left\\\{" "\\right. proc multiBigLeftBrace {} { checkMathMode "multiBigLeftBrace" 1 insertBigDelims "\\left\\\{" "\\right. proc doOtherMixedBigDelims {name isMultiline} { checkMathMode $name 1 catch {prompt "Choose LEFT delimiter:" "parenthesis" "" "parenthesis" \ "bracket" "brace" "vertical bar" "double bar" \ "angle bracket" "ceiling" "floor" "slash" "backslash" \ "none"} delimType if {$delimType != "cancel"} then { switch $delimType { "parenthesis" {set leftDelim "("} "bracket" {set leftDelim "\["} "brace" {set leftDelim "\\\{"} "vertical bar" {set leftDelim "|"} "double bar" {set leftDelim "\\|"} "angle bracket" {set leftDelim "\\langle"} "ceiling" {set leftDelim "\\lceil"} "floor" {set leftDelim "\\lfloor"} "slash" {set leftDelim "/"} "backslash" {set leftDelim "\\backslash"} "none" {set leftDelim "."} default { alertnote "\"$delimType\" not recognized" return catch {prompt "Choose RIGHT delimiter:" "parenthesis" "" "parenthesis" \ "bracket" "brace" "vertical bar" "double bar" \ "angle bracket" "ceiling" "floor" "slash" "backslash" \ "none"} delimType if {$delimType != "cancel"} then { switch $delimType { "parenthesis" {set rightDelim ")"} "bracket" {set rightDelim "\]"} "brace" {set rightDelim "\\\}"} "vertical bar" {set rightDelim "|"} "double bar" {set rightDelim "\\|"} "angle bracket" {set rightDelim "\\rangle"} "ceiling" {set rightDelim "\\rceil"} "floor" {set rightDelim "\\rfloor"} "slash" {set rightDelim "/"} "backslash" {set rightDelim "\\backslash"} "none" {set rightDelim "."} default { alertnote "\"$delimType\" not recognized" return } insertBigDelims "\\left$leftDelim" "\\right$rightDelim " $isMultiline proc otherMixedBigDelims {} { doOtherMixedBigDelims "otherMixedBigDelims" 0 proc otherMultiMixedBigDelims {} { doOtherMixedBigDelims "otherMultiMixedBigDelims" 1 #-------------------------------------------------------------------------- # Accents: #-------------------------------------------------------------------------- proc acute {} { checkMathMode "acute" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\acute{" "} "]} then { message "accent set" } else { message "enter one character" proc bar {} { checkMathMode "bar" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\bar{" "} "]} then { message "accent set" } else { message "enter one character" proc breve {} { checkMathMode "breve" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\breve{" "} "]} then { message "accent set" } else { message "enter one character" proc check {} { checkMathMode "check" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\check{" "} "]} then { message "accent set" } else { message "enter one character" proc dot {} { checkMathMode "dot" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\dot{" "} "]} then { message "accent set" } else { message "enter one character" proc ddot {} { checkMathMode "ddot" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\ddot{" "} "]} then { message "accent set" } else { message "enter one character" proc grave {} { checkMathMode "grave" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\grave{" "} "]} then { message "accent set" } else { message "enter one character" proc hat {} { checkMathMode "hat" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\hat{" "} "]} then { message "accent set" } else { message "enter one character" proc tilde {} { checkMathMode "tilde" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\tilde{" "} "]} then { message "accent set" } else { message "enter one character" proc vec {} { checkMathMode "vec" 1 if {[isSelection] > 1} then { alertnote "Warning: only a single character may be accented!" if {[wrapObject "\\vec{" "} "]} then { message "accent set" } else { message "enter one character" proc widehat {} { checkMathMode "widehat" 1 if {[isSelection] > 3} then { alertnote "Warning: only a few characters may be accented!" if {[wrapObject "\\widehat{" "} "]} then { message "accent set" } else { message "enter a few characters" proc widetilde {} { checkMathMode "widetilde" 1 if {[isSelection] > 3} then { alertnote "Warning: only a few characters may be accented!" if {[wrapObject "\\widetilde{" "} "]} then { message "accent set" } else { message "enter a few characters" proc imath {} {checkMathMode "imath" 1; insertObject "\\imath"} proc jmath {} {checkMathMode "jmath" 1; insertObject "\\jmath"} #-------------------------------------------------------------------------- # Grouping: #-------------------------------------------------------------------------- proc underline {} { checkMathMode "underline" 1 if {[wrapObject "\\underline{" "} "]} then { message "selection underlined" } else { message "enter text" proc overline {} { checkMathMode "overline" 1 if {[wrapObject "\\overline{" "} "]} then { message "selection overlined" } else { message "enter text" proc underbrace {} { checkMathMode "underbrace" 1 if {[wrapObject "\\underbrace{" "} "]} then { message "selection underbraced" } else { message "enter text" proc overbrace {} { checkMathMode "overbrace" 1 if {[wrapObject "\\overbrace{" "} "]} then { message "selection overbraced" } else { message "enter text" proc overrightarrow {} { checkMathMode "overrightarrow" 1 if {[wrapObject "\\overrightarrow{" "} "]} then { message "selection overrightarrowed" } else { message "enter text" proc overleftarrow {} { checkMathMode "overleftarrow" 1 if {[wrapObject "\\overleftarrow{" "} "]} then { message "selection overleftarrowed" } else { message "enter text" proc stackrel {} { checkMathMode "stackrel" 1 set currentPos [getPos] if {[insertObject "\\stackrel{ "]} then { goto $currentPos nextTabStop message "1st arg scriptstyle" #-------------------------------------------------------------------------- # Spacing: #-------------------------------------------------------------------------- proc negThin {} {checkMathMode "negThin" 1; insertObject "\\!"} proc thin {} {checkMathMode "thin" 1; insertObject "\\,"} proc medium {} {checkMathMode "medium" 1; insertObject "\\:"} proc thick {} {checkMathMode "thick" 1; insertObject "\\;"} proc quad {} {checkMathMode "quad" 1; insertObject "\\quad"} proc qquad {} {checkMathMode "qquad" 1; insertObject "\\qquad"} proc hspace {} { checkMathMode "hspace" 1 if {[wrapObject "\\hspace{" "} "]} then { message "spacing set" } else { message "enter the desired horizontal spacing" proc vspace {} { checkMathMode "vspace" 1 if {[wrapObject "\\vspace{" "} "]} then { message "spacing set" } else { message "enter the desired horizontal spacing" proc hfill {} {checkMathMode "hfill" 1; insertObject "\\hfill"} proc vfill {} {checkMathMode "vfill" 1; insertObject "\\vfill"} proc smallskip {} {checkMathMode "smallskip" 1; insertObject "\\smallskip"} proc medskip {} {checkMathMode "medskip" 1; insertObject "\\medskip"} proc bigskip {} {checkMathMode "bigskip" 1; insertObject "\\bigskip"}